<?php 

if (!$this->form) return;

$show = 0;
$elements = $this->form->getElements();
foreach ($elements as $element) {
	if ($element->getAttrib('class') == 'map') {
		$show = 1;
	}
}

if (!$show) {
	return;
}

$key = Config::getInstance()->yandex->key;
?>

<script src="http://api-maps.yandex.ru/1.1/index.xml?key=<?php echo $key;?>" type="text/javascript"></script>";
<script type='text/javascript' template='<?php echo basename(__FILE__); ?>'>

var map, geoResult, clickPlace, mapTimeout;

$(function() {
	mapInput = $('.map');
	mapInput.after("<div id='yandex-map' style='width: 600px;height: 400px;' />");
	mapInput.after("<span id='map-error' style='padding-left: 20px; font-weight: bold; color: red;' />");

	mapInput.keyup(function() {
		value = mapInput.val();
		if (value != '') {
			clearTimeout(mapTimeout);
			mapTimeout = setTimeout(function() {
				if (mapInput.val() != value) {
					return;
				}

				showAddress(value);
			}, 900);
		}
	});
	
});

// Создание обработчика для события window.onLoad
YMaps.jQuery(function () {
	// Создание экземпляра карты и его привязка к созданному контейнеру
	map = new YMaps.Map(YMaps.jQuery("#yandex-map")[0]);
	
	// Установка балуна при загрузке карты на введенном адресе
	value = $('.map').val();
	if (value != '') {
		showAddress(value);
	} else {
		// Установка для карты ее центра и масштаба
		map.setCenter(new YMaps.GeoPoint(37.64, 55.76), 10);
	}
	
	// Добавление элементов управления
	map.enableScrollZoom();
	map.addControl(new YMaps.Zoom());

	var listener = YMaps.Events.observe(map, map.Events.Click, function (map, mEvent) {
        var clickPoint  = mEvent.getGeoPoint();

        // Удаляет предыдущие результаты поиска (если были добавлены на карту)
        if (geoResult) {
            map.removeOverlay(geoResult);
            result = null;
        }

        if (clickPlace) {
            map.removeOverlay(clickPlace);
            clickPlace = null;
        }

        // Отмечает точку, по которой щелкнул пользователь
        clickPlace = new YMaps.Placemark(clickPoint);
        // clickPlace.description = clickPoint.toString();
        // map.addOverlay(clickPlace);

        // Запускает процесс геокодирования
        geocode(clickPoint);
	});

	// Геокодирует координаты щелчка мыши по карте
	geocode = function (clickPoint) {
	    // Выключает обработчики событий, чтобы создать не более одного запроса к геокодеру
	    // (по окончании геокодирования обработчик включается вновь)
	    listener.disable();

	    // Запуск процесса геокодирования
	    var geocoder = new YMaps.Geocoder(clickPoint);

	    // Обработчик успешного завершения геокодирования
	    YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {
	        // Получение результата поиска
	        geoResult = getResult(geocoder);

	        if (geoResult) {
	            // Добавляет на карту результат геокодирования и открывает балун
	            map.addOverlay(geoResult);
	            map.setBounds(geoResult.getBounds());

				value = geoResult.text;
				$(".map").val(value);
	            
	        } else {
				mapError = $("#map-error");
				mapError.text("Адрес не найден...");
				mapError.css('display', 'inline');
				mapError.stop().fadeTo(0, 1).fadeOut(1000);
	        }

	        // Включает обработчик щелчка мыши по карте
	        listener.enable();
	    });

	    // Обработчик неудачного геокодирования
	    YMaps.Events.observe(geocoder, geocoder.Events.Fault, function (geocoder, err) {
			mapError = $("#map-error");
			mapError.text("Произошла ошибка: " + error);
			mapError.css('display', 'inline');
			mapError.stop();
			mapError.stop().fadeTo(0, 1).fadeOut(10000);

	        // Включает обработчик щелчков мыши по карте
	        listener.enable();
	    });
	}

	getResult = function (geocoder) {
		   // Точность: город, страна
		   function isOther (result) {
		       return result.precision == "other";
		   }

		   // Точность: улица
		   function isStreet (result) {
		       return result.precision == "street";
		   }

		   // Точность: дом
		   function isHouse (result) {
		       return !isOther(result) && !isStreet(result);
		   };

		   // Выбирает точность поиска
		   var filter = isHouse;
		   if (map.getZoom() < 10) {
		       filter = isOther;
		   } else if (map.getZoom() < 15) {
		       filter = isStreet;
		   }

		   // Возвращает первый найденный результат с необходимой точностью
		   return geocoder.filter(filter)[0];
		}
	
});

// Функция для отображения результата геокодирования
// Параметр value - адрес объекта для поиска
function showAddress (value) {
	// Удаление предыдущего результата поиска
	map.removeOverlay(geoResult);
	
	// Запуск процесса геокодирования
	var geocoder = new YMaps.Geocoder(value, {results: 1, boundedBy: map.getBounds()});
	
	// Создание обработчика для успешного завершения геокодирования
	YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
		// Если объект был найден, то добавляем его на карту
		// и центрируем карту по области обзора найденного объекта
		if (this.length()) {
			geoResult = this.get(0);
			map.addOverlay(geoResult);
			map.setBounds(geoResult.getBounds());
		} else {
			mapError = $("#map-error");
			mapError.text("Адрес не найден...");
			mapError.css('display', 'inline');
			mapError.stop().fadeTo(0, 1).fadeOut(1000);
		}
	});
			
	// Процесс геокодирования завершен неудачно
	YMaps.Events.observe(geocoder, geocoder.Events.Fault, function (geocoder, error) {
		mapError = $("#map-error");
		mapError.text("Произошла ошибка: " + error);
		mapError.css('display', 'inline');
		mapError.stop();
		mapError.stop().fadeTo(0, 1).fadeOut(10000);
	});
}


</script>
